#ifndef LOGGER_H
#define LOGGER_H

#include <QObject>
#include <QString>
#include <QMutex>
#include <QFile>
#include <QTextStream>
#include "services/DatabaseService.h"

/**
 * @brief 日志工具类（单例模式）
 * @details 提供日志记录功能：
 *          1. 操作日志：记录到数据库 operation_logs 表
 *          2. 文件日志：记录到日志文件（可选）
 *          3. 控制台输出：使用 Qt 的 qDebug/qInfo/qWarning/qCritical
 */
class Logger : public QObject
{
    Q_OBJECT

public:
    // 日志级别
    enum LogLevel
    {
        Debug,    // 调试信息
        Info,     // 一般信息
        Warning,  // 警告
        Critical, // 严重错误
        Fatal     // 致命错误
    };

    // 获取单例实例
    static Logger *instance();

    // 禁止拷贝构造和赋值
    Logger(const Logger &) = delete;
    Logger &operator=(const Logger &) = delete;

    // 初始化日志系统
    bool initialize(const QString &logFilePath = QString());

    // 记录操作日志到数据库
    bool logOperation(const QString &operationType,
                      const QString &targetObject = QString(),
                      const QString &description = QString(),
                      const QString &userName = QString(),
                      const QString &result = "success",
                      const QString &errorMessage = QString());

    // 记录日志到文件（可选）
    void logToFile(LogLevel level, const QString &message);

    // 便捷方法：记录不同级别的日志
    void debug(const QString &message);
    void info(const QString &message);
    void warning(const QString &message);
    void critical(const QString &message);

    // 设置是否启用文件日志
    void setFileLoggingEnabled(bool enabled) { m_fileLoggingEnabled = enabled; }
    bool isFileLoggingEnabled() const { return m_fileLoggingEnabled; }

    // 设置日志级别过滤
    void setLogLevel(LogLevel level) { m_logLevel = level; }
    LogLevel logLevel() const { return m_logLevel; }

    // 关闭日志系统
    void close();

signals:
    // 日志记录信号（可用于 UI 显示）
    void logRecorded(const QString &level, const QString &message, const QString &timestamp);

private:
    explicit Logger(QObject *parent = nullptr);
    ~Logger();

    // 将日志级别转换为字符串
    QString logLevelToString(LogLevel level);

private:
    static Logger *s_instance; // 单例实例
    static QMutex s_mutex;     // 互斥锁

    bool m_initialized;        // 是否已初始化
    bool m_fileLoggingEnabled; // 是否启用文件日志
    LogLevel m_logLevel;       // 日志级别过滤
    QString m_logFilePath;     // 日志文件路径
    QFile *m_logFile;          // 日志文件对象
    QTextStream *m_logStream;  // 日志文件流
};

// 全局便捷宏
#define LOG_DEBUG(msg) Logger::instance()->debug(msg)
#define LOG_INFO(msg) Logger::instance()->info(msg)
#define LOG_WARNING(msg) Logger::instance()->warning(msg)
#define LOG_CRITICAL(msg) Logger::instance()->critical(msg)

#define LOG_OPERATION(type, target, desc) Logger::instance()->logOperation(type, target, desc)

#endif // LOGGER_H
